import org.junit.Assert;
import org.junit.Test;

import java.io.Console;

public class 测试参考书中的示例代码 {

    @Test
    public void 测试Apple(){
        var 源码 = 测试工具.读测试资源("apple.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertTrue(解释器.打印输出缓存.toString().endsWith("28.8foo"));
    }
    
    @Test
    public void 测试Cherry(){
        var 源码 = 测试工具.读测试资源("cherry.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"8");
    }

    @Test
    public void 测试Factorial(){
        var 源码 = 测试工具.读测试资源("factorial.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"3628800");
    }
    
    @Test
    public void 测试Forward(){
        var 源码 = 测试工具.读测试资源("forward.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"8{name=null, password=null}");
        
    }
    
    @Test
    public void 测试LocalStruct(){
        var 源码 = 测试工具.读测试资源("localstruct.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"{name=null, password=null}{x=null, y=null}");
    }
    
    @Test
    public void 测试LookUp(){
        var 源码 = 测试工具.读测试资源("lookup.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"103");
    }
    
    @Test
    public void 测试Struct(){
        var 源码 = 测试工具.读测试资源("struct.pie");
        var 解释器 = 测试工具.解释并执行(源码);
        Assert.assertEquals(解释器.打印输出缓存.toString(),"Login: parrt{name=parrt, password=null}");
    }
    
    @Test
    public void 测试StructErrors(){
        var 源码 = 测试工具.读测试资源("structerrors.pie");

        try {
            测试工具.解释并执行(源码);
            Assert.fail("应该抛出异常");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
